package dominio;

import java.io.Serializable;

//import org.uqbar.commons.model.ObservableUtils;
import org.uqbar.commons.utils.Observable;

import exceptions.CasilleroOcupado;
import exceptions.ErrorTerreno;

@SuppressWarnings("serial")
@Observable
public class Casillero implements Serializable{
	private Planta planta = null;
	// true terrestre, false acuatico
	private boolean terrestre;

	public Casillero(boolean terrestre) {
		this.terrestre = terrestre;
	}

	public Planta getPlanta() {
		return planta;
	}
	
	/**
	 * Settea la planta y notifica que cambio el ocupante
	 * @param planta
	 */
	public void setPlanta(Planta planta) {
		this.planta = planta;
		System.out.println("Planta "+ planta + " plantada!!");
		//ObservableUtils.forceFirePropertyChanged(this, "ocupante", this.getOcupante());
	}

	/**
	 * Si el casillero esta libre y la planta corresponde
	 * con el tipo de terreno, entonces se planta
	 * @param planta, a plantar
	 * @throws CasilleroOcupado si habia una planta antes
	 * @throws ErrorTerreno si no corresponde el tipo
	 */
	public void plantar(Planta planta) {
		System.out.println(" El tipo de la planta " +planta.getDescripcion()+ "es " + planta.getTerrestre());
		System.out.println(" El tipo del casillero donde será plantado es " + this.terrestre);
		if(this.ocupado()) {
			System.out.println("No estoy ocupado");
			throw new CasilleroOcupado();
		}
		
		if (planta.getTerrestre() == this.getTerrestre()) {
			System.out.println("Terreno admitido... agregandk planta");
			this.setPlanta(planta.makeClone());
	} else {
			throw new ErrorTerreno();
		}
	}

	/**
	 * Setea la variable planta en null
	 */
	public void desplantar() {
		this.setPlanta(null);
	}
	
	/**
	 * Pregunta si la variable planta es distinto de null
	 * @return
	 */
	public boolean ocupado() {
		return this.planta != null;
	}
	/**
	 * Arena necesita que el metodo empiece con "get" para que acceda a el
	 * @return
	 */
	public String getOcupante(){
		return this.planta == null ? "vacio" : this.planta.getNombre() +"\n ATK:"+ this.planta.getPuntosAtaque()+" DEF:"+ this.planta.getPuntosDefensa();
	}
	
	public String getNombreOcupante(){
		return this.planta == null ? "vacio" : this.planta.getNombre();
	}
	
	public boolean getTerrestre() {
		return terrestre;
	}

	public void setTerrestre(boolean terrestre) {
		this.terrestre = terrestre;
	}

	public String getPlantaDetalles() {
		return  this.planta == null ? "" : this.planta.getDetalles();
	}
}
